package cn.edu.zut.sunday.base.init;

import cn.edu.zut.sunday.utils.ThreadUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

@Slf4j
public class AutoImportDataService implements ApplicationListener<ContextRefreshedEvent> {

    protected InitDatabaseService initDatabaseService;

    /**
     * 启动服务，执行时仍然提供服务，服务初始化之后，执行方法
     */
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        // 从json文件读取数据导入数据库中
        importData2DB(event);
    }

    /**
     * 系统启动成功后，根据importDB参数读取文件信息，并开始加载数据到数据库中
     *
     * @param event ContextRefreshedEvent对象
     */
    private void importData2DB(ContextRefreshedEvent event) {
        if (event.getApplicationContext().getParent() == null) {
            final String importDB = event.getApplicationContext().getEnvironment()
              .getProperty("importDB", String.class, "none");
            final boolean syncImport = event.getApplicationContext().getEnvironment()
              .getProperty("syncImport", Boolean.class, false);
            // 如果为none，则表示没有设置导入数据集信息，则直接返回
            if ("none".equals(importDB)) {
                log.info("没有数据集需要导入到系统！");
                return;
            }
            log.info("自动导入数据集 [importDB] 参数值: {}", importDB);
            // 如果importDB包含all或者包含对应的数据库，则执行插入操作
            if (importDB.contains("all")
              || importDB.contains(initDatabaseService.datasetName())) {
                log.info("开始【{}】导入数据集【{}】到数据库中...", syncImport ? "同步" : "异步",
                  initDatabaseService.datasetName());
                if (syncImport) {
                    // 同步
                    sync();
                } else {
                    // 异步
                    async();
                }
            }

        }
    }

    /**
     * 同步导入数据导数据库
     */
    private void sync() {
        boolean success = initDatabaseService.initDatabase();

        if (success) {
            log.info("插入数据集【{}】信息成功！", initDatabaseService.datasetName());
        } else {
            log.error("插入数据集【{}】信息失败！", initDatabaseService.datasetName());
        }
    }

    /**
     * 异步导入数据导数据库
     */
    private void async() {
        // 异步执行插入数据
        ThreadUtils.POOL.submit(initDatabaseService,
          String.format("插入数据集【%s】信息成功！", initDatabaseService.datasetName()),
          String.format("插入数据集【%s】信息失败！", initDatabaseService.datasetName()));
    }
}
